<?php

declare(strict_types=1);

namespace app\model\oa;

use think\Model;

/**
 * 消息模板模型
 * @package app\model\oa
 */
class Template extends Model
{
    /**
     * 表名（不含前缀）
     * @var string
     */
    protected $name = 'template';

    /**
     * 主键
     * @var string
     */
    protected $pk = 'id';

    /**
     * 自动时间戳
     * @var bool
     */
    protected $autoWriteTimestamp = false;

    /**
     * 创建时间字段
     * @var string
     */
    protected $createTime = 'create_time';

    /**
     * 更新时间字段
     * @var string
     */
    protected $updateTime = 'update_time';

    /**
     * 软删除字段
     * @var string
     */
    protected $deleteTime = 'delete_time';

    /**
     * 类型常量
     */
    const TYPE_SYSTEM = 1; // 系统类型
    const TYPE_CUSTOM = 2; // 自定义类型

    /**
     * 状态常量
     */
    const STATUS_DELETED = -1; // 已删除
    const STATUS_DISABLED = 0; // 禁用
    const STATUS_ENABLED = 1;  // 启用

    /**
     * 字段类型映射
     * @var array
     */
    protected $schema = [
        'id' => 'int',
        'title' => 'string',
        'name' => 'string',
        'types' => 'int',
        'remark' => 'string',
        'msg_title' => 'string',
        'msg_link' => 'string',
        'msg_content' => 'string',
        'weixin_title' => 'string',
        'weixin_link' => 'string',
        'weixin_content' => 'string',
        'mobile_title' => 'string',
        'mobile_link' => 'string',
        'mobile_content' => 'string',
        'email_title' => 'string',
        'email_link' => 'string',
        'email_content' => 'string',
        'status' => 'int',
        'admin_id' => 'int',
        'create_time' => 'int',
        'update_time' => 'int',
        'delete_time' => 'int',
    ];

    /**
     * 关联创建人
     * @return \think\model\relation\HasOne
     */
    public function creator()
    {
        return $this->hasOne('app\model\oa\Admin', 'id', 'admin_id')
            ->field('id,username,nickname,avatar');
    }

    /**
     * 根据状态获取模板列表
     * @param int $status
     * @return \think\Paginator
     */
    public static function getListByStatus(int $status = self::STATUS_ENABLED)
    {
        return self::where('status', $status)
            ->order('id', 'desc')
            ->paginate();
    }

    /**
     * 获取启用的模板
     * @return \think\model\Collection
     */
    public static function getEnabledTemplates()
    {
        return self::where('status', self::STATUS_ENABLED)
            ->order('id', 'desc')
            ->select();
    }

    /**
     * 根据名称获取模板
     * @param string $name
     * @return \think\Model|null
     */
    public static function getByName(string $name)
    {
        return self::where('name', $name)
            ->where('status', self::STATUS_ENABLED)
            ->find();
    }

    /**
     * 根据类型获取模板
     * @param int $type
     * @return \think\model\Collection
     */
    public static function getByType(int $type)
    {
        return self::where('types', $type)
            ->where('status', self::STATUS_ENABLED)
            ->order('id', 'desc')
            ->select();
    }

    /**
     * 渲染模板内容
     * @param string $field
     * @param array $variables
     * @return string
     */
    public function renderTemplate(string $field, array $variables = []): string
    {
        $content = $this->$field ?? '';
        
        if (empty($variables)) {
            return $content;
        }

        foreach ($variables as $key => $value) {
            $content = str_replace('{' . $key . '}', (string)$value, $content);
        }

        return $content;
    }

    /**
     * 获取消息模板内容
     * @param array $variables
     * @return array
     */
    public function getMessageTemplate(array $variables = []): array
    {
        return [
            'title' => $this->renderTemplate('msg_title', $variables),
            'link' => $this->renderTemplate('msg_link', $variables),
            'content' => $this->renderTemplate('msg_content', $variables),
        ];
    }

    /**
     * 获取企业微信模板内容
     * @param array $variables
     * @return array
     */
    public function getWeixinTemplate(array $variables = []): array
    {
        return [
            'title' => $this->renderTemplate('weixin_title', $variables),
            'link' => $this->renderTemplate('weixin_link', $variables),
            'content' => $this->renderTemplate('weixin_content', $variables),
        ];
    }

    /**
     * 获取手机消息模板内容
     * @param array $variables
     * @return array
     */
    public function getMobileTemplate(array $variables = []): array
    {
        return [
            'title' => $this->renderTemplate('mobile_title', $variables),
            'link' => $this->renderTemplate('mobile_link', $variables),
            'content' => $this->renderTemplate('mobile_content', $variables),
        ];
    }

    /**
     * 获取邮件模板内容
     * @param array $variables
     * @return array
     */
    public function getEmailTemplate(array $variables = []): array
    {
        return [
            'title' => $this->renderTemplate('email_title', $variables),
            'link' => $this->renderTemplate('email_link', $variables),
            'content' => $this->renderTemplate('email_content', $variables),
        ];
    }

    /**
     * 状态描述获取器
     * @param int $value
     * @return string
     */
    public function getStatusTextAttr(int $value): string
    {
        $statusMap = [
            self::STATUS_DELETED => '已删除',
            self::STATUS_DISABLED => '禁用',
            self::STATUS_ENABLED => '启用',
        ];
        return $statusMap[$value] ?? '未知';
    }

    /**
     * 类型描述获取器
     * @param int $value
     * @return string
     */
    public function getTypeTextAttr(int $value): string
    {
        $typeMap = [
            self::TYPE_SYSTEM => '系统',
            self::TYPE_CUSTOM => '自定义',
        ];
        return $typeMap[$value] ?? '未知';
    }

    /**
     * 状态搜索器
     * @param \think\db\Query $query
     * @param mixed $value
     */
    public function searchStatusAttr($query, $value)
    {
        if ($value !== '') {
            $query->where('status', $value);
        }
    }

    /**
     * 类型搜索器
     * @param \think\db\Query $query
     * @param mixed $value
     */
    public function searchTypeAttr($query, $value)
    {
        if ($value !== '') {
            $query->where('types', $value);
        }
    }

    /**
     * 标题搜索器
     * @param \think\db\Query $query
     * @param mixed $value
     */
    public function searchTitleAttr($query, $value)
    {
        if ($value !== '') {
            $query->whereLike('title', '%' . $value . '%');
        }
    }

    /**
     * 名称搜索器
     * @param \think\db\Query $query
     * @param mixed $value
     */
    public function searchNameAttr($query, $value)
    {
        if ($value !== '') {
            $query->whereLike('name', '%' . $value . '%');
        }
    }
}